package session

import (
	"github.com/gin-gonic/gin"
	"github.com/gorilla/sessions"
	"gopkg.in/boj/redistore.v1"
	"net/http"
	"zong-microservice/pkg/config"
	"zong-microservice/pkg/logger"
)

// Session 当前会话
var Session *sessions.Session

// Request 用以获取会话
var Request *http.Request

// Response 用以写入会话
var Response http.ResponseWriter

// StartSession 初始化会话，在中间件中调用
func StartSession(context *gin.Context) {
	var err error

	switch config.Get("session", "driver") {
	case "cookie":
		// Store gorilla sessions 的存储库
		Store := sessions.NewCookieStore([]byte(config.Get("app", "key")))
		// Store.Get() 的第二个参数是 Cookie 的名称
		// gorilla/sessions 支持多会话，本项目我们只使用单一会话即可
		Session, err = Store.Get(context.Request, config.Get("session", "name"))
		logger.LogError(err)

	case "redis":
		Store, err := redistore.NewRediStore(10, "tcp", config.Get("redis", "addr"), config.Get("redis", "password"), []byte(config.Get("app", "key")))
		logger.LogError(err)
		Session, err = Store.Get(context.Request, config.Get("session", "name"))
		logger.LogError(err)

	}
}

// Set 写入键值对应的会话数据
func Set(key string, value interface{}) {
	Session.Values[key] = value
	Save()
}

// Get 获取会话数据，获取数据时请做类型检测
func Get(key string) interface{} {
	return Session.Values[key]
}

// Forget 删除某个会话项
func Forget(key string) {
	delete(Session.Values, key)
	Save()
}

// Flush 删除当前会话
func Flush() {
	Session.Options.MaxAge = -1
	Save()
}

// Save 保持会话
func Save() {
	// 非 HTTPS 的链接无法使用 Secure 和 HttpOnly
	// Session.Options.Secure = true
	// Session.Options.HttpOnly = true
	err := Session.Save(Request, Response)
	logger.LogError(err)
}
